home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / CarbonizedMenus / source / RootMenu.cp < prev   
Text File  |  1999-06-26  |  20KB  |  632 lines

  1. /****************************************************************************************
  2.     RootMenu.cp
  3.     
  4.     Copyright © 1999 Red Shed Software. All rights reserved.
  5.     by Jonathan 'Wolf' Rentzsch (jon@redshed.net)
  6.     
  7.     Commenter    Date                Comment
  8.     ---------    -----------------    -----------------------------------------------------
  9.     wolf        Fri, Jun 25, 1999    Created.
  10.     
  11.     ************************************************************************************/
  12.  
  13. #include    "RootMenu.h"
  14. #include    "MacExceptions.h"
  15. #include    "FontInfo.h"
  16. #include    "require.h"
  17. #include    "TextServices.h"
  18. #include    "XProcessInfoRec.h"
  19. #include    "MenuList.h"
  20. #include    "AutoPort.h"
  21.  
  22. const    RGBColor    kBottomRightColor    =    kLightGray;
  23. const    RGBColor    kTopLeftColor        =    kUnionGray;
  24. const    RGBColor    kBodyColor            =    kLighterGray;
  25. const    short        kTopMargin            =    4;
  26. const    short        kLeftMargin            =    4;
  27. const    short        kBottomMargin        =    6;
  28. const    short        kRightMargin        =    4;
  29. const    short        kIconMargin            =    6;
  30. const    short        kCmdMargin            =    4;
  31. const    short        kSubMenuWidth        =    6;
  32. const    short        kIconWidth            =    9;
  33. const    short        kIconHalfHieght        =    4;
  34.  
  35. list< AbstractMenuWindow* >    gMenus;
  36. Point                        gRootLoc = { 5, 5 };
  37.  
  38.     bool
  39. ExtractMenuIcon(
  40.     MenuHandle    menu,
  41.     Handle        &iconSuite );
  42.  
  43.     short
  44. GetWindowWidth(
  45.     WindowRecord    *w );
  46.     
  47.     Point
  48. GetWindowLoc(
  49.     WindowRecord    *w );
  50.     
  51.     void
  52. DrawBlackBox(
  53.     const    Rect    &rect );
  54.     
  55.     void
  56. DrawGrayBox(
  57.     const    Rect    &rect );
  58.  
  59.     void
  60. DrawWhiteBox(
  61.     const    Rect    &rect );
  62.     
  63.     void
  64. DrawSubMenu(
  65.     const    Rect    &rect );
  66.     
  67. CleanUp    gCleanUp;
  68.  
  69. /****************************************************************************************
  70.     Commenter    Date                Comment
  71.     ---------    -----------------    -----------------------------------------------------
  72.     wolf        Fri, Jun 25, 1999    Created.
  73.     
  74.     ************************************************************************************/
  75.  
  76. AbstractMenuWindow::AbstractMenuWindow()
  77. {
  78.     Rect        r = { 40, 40, 300, 300 };
  79.     WindowPtr    w = nil;
  80.     ThrowIfErr( NewServiceWindow( window(), &r, "\p", true, plainDBox, (WindowPtr) -1,
  81.                 true, (ComponentInstance) kCurrentProcess, &w ), nil );
  82.     window_.refCon = (long) this;
  83.     
  84.     SetPort( window() );
  85.     PenNormal();
  86.     short    fontID;
  87.     GetFNum( "\pHelvetica", &fontID );
  88.     TextFont( fontID );
  89.     TextFace( bold );
  90.     gMenus.push_back( this );
  91. }
  92.  
  93. /****************************************************************************************
  94.     Commenter    Date                Comment
  95.     ---------    -----------------    -----------------------------------------------------
  96.     wolf        Fri, Jun 25, 1999    Created.
  97.     
  98.     ************************************************************************************/
  99.  
  100. AbstractMenuWindow::~AbstractMenuWindow()
  101. {
  102.     gMenus.remove( this );
  103.     CloseServiceWindow( window() );
  104. }
  105.  
  106. /****************************************************************************************
  107.     Commenter    Date                Comment
  108.     ---------    -----------------    -----------------------------------------------------
  109.     wolf        Fri, Jun 25, 1999    Created.
  110.     
  111.     ************************************************************************************/
  112.  
  113. RootMenu::RootMenu()
  114. {
  115.     //-------------------------------------------------
  116.     //    Figure out the width & height of the window
  117.     
  118.     MoveWindow( window(), gRootLoc.h, gRootLoc.v, false );
  119.     short            minWidth = 0;// kLeftMargin + kCmdMargin + kRightMargin;
  120.     
  121.     //    Process Window Title
  122.     Str255            s;
  123.     FrontProcess    frontProcess( s );
  124.     short            x = StringWidth( s );
  125.     if( x > minWidth )
  126.         minWidth = x;
  127.     
  128.     //    Apple Menu Item
  129.     if( 16 > minWidth )
  130.         minWidth = 16;
  131.     
  132.     //    "Normal" Menus
  133.     MenuListHandle    list = GetMenuList();
  134.                     RequireHandle( list );
  135.     UInt16            count = (**list).menuCount / 6;
  136.     
  137.     for( UInt16 index = 1; index < count; ++index ) {    //    Skip over apple menu
  138.         MenuHandle    menu = (**list).menus[ index ].menu;
  139.                     RequireHandle( menu );
  140.         Handle        iconHandle = nil;
  141.         bool        hasIcon = ExtractMenuIcon( menu, iconHandle );
  142.                     RequireHandleIfNotNil( iconHandle );
  143.         if( !hasIcon ) {
  144.             BlockMoveData( &menu[0]->menuData, s, menu[0]->menuData[ 0 ] + 1 );
  145.             x = StringWidth( s );
  146.             if( x > minWidth )
  147.                 minWidth = x;
  148.         }
  149.     }
  150.     
  151.     minWidth += kLeftMargin + kCmdMargin + kSubMenuWidth + kRightMargin;
  152.     short    menuItemCount = 1 + count;
  153.     short    minHeight = menuItemCount * (kTopMargin + GetMaxFontHeight( "\pHelvetica", 12, bold ) + kBottomMargin);
  154.     
  155.     SizeWindow( window(), minWidth, minHeight, false );
  156.     
  157.     Draw();
  158. }
  159.  
  160. /****************************************************************************************
  161.     Commenter    Date                Comment
  162.     ---------    -----------------    -----------------------------------------------------
  163.     wolf        Fri, Jun 25, 1999    Created.
  164.     
  165.     ************************************************************************************/
  166.  
  167.     void
  168. RootMenu::Draw()
  169. {
  170.     AutoPort    autoPort( window() );
  171.     
  172.     short    itemHeight = kTopMargin + GetMaxFontHeight( "\pHelvetica", 12, bold ) + kBottomMargin;
  173.     Rect    curRect = { 0, 0, itemHeight, GetWindowWidth( &window_ ) };
  174.     
  175.     //    Title
  176.     DrawBlackBox( curRect );
  177.     Str255            s;
  178.     FrontProcess    frontProcess( s );
  179.     MoveTo( curRect.left + kLeftMargin, curRect.bottom - kBottomMargin );
  180.     RGBForeColor( &kRGBWhite );
  181.     DrawString( s );
  182.     
  183.     //    Apple Menu
  184.     curRect.top += itemHeight;
  185.     curRect.bottom += itemHeight;
  186.     DrawGrayBox( curRect );
  187.     
  188.     short    diff = (itemHeight - 16) / 2;
  189.     Rect    iconRect = { curRect.top + diff, curRect.left + kLeftMargin,
  190.                         curRect.bottom - diff, curRect.left + kLeftMargin + 16 };
  191.     ThrowIfErr( PlotIconID( &iconRect, kAlignNone, kTransformNone, -16386 ), nil );
  192.     DrawSubMenu( curRect );
  193.     
  194.     //    Normal Menus
  195.     MenuListHandle    list = GetMenuList();
  196.                     RequireHandle( list );
  197.     UInt16            count = (**list).menuCount / 6;
  198.     
  199.     for( UInt16 index = 1; index < count; ++index ) {    //    Skip over apple menu
  200.         MenuHandle    menu = (**list).menus[ index ].menu;
  201.                     RequireHandle( menu );
  202.         Handle        iconHandle = nil;
  203.         bool        hasIcon = ExtractMenuIcon( menu, iconHandle );
  204.                     RequireHandleIfNotNil( iconHandle );
  205.         curRect.top += itemHeight;
  206.         curRect.bottom += itemHeight;
  207.         DrawGrayBox( curRect );
  208.         if( hasIcon ) {
  209.             short    diff = (itemHeight - 16) / 2;
  210.             Rect    iconRect = { curRect.top + diff, curRect.left + kLeftMargin,
  211.                                 curRect.bottom - diff, curRect.left + kLeftMargin + 16 };
  212.             ThrowIfErr( PlotIconSuite( &iconRect, kAlignNone, kTransformNone, (IconSuiteRef) iconHandle ), nil );
  213.             DrawSubMenu( curRect );
  214.         } else {
  215.             MoveTo( curRect.left + kLeftMargin, curRect.bottom - kBottomMargin );
  216.             RGBForeColor( &kRGBBlack );
  217.             BlockMoveData( &menu[0]->menuData, s, menu[0]->menuData[ 0 ] + 1 );
  218.             DrawString( s );
  219.             DrawSubMenu( curRect );
  220.         }
  221.     }
  222. }
  223.  
  224. /****************************************************************************************
  225.     Commenter    Date                Comment
  226.     ---------    -----------------    -----------------------------------------------------
  227.     wolf        Sat, Jun 26, 1999    Created.
  228.     
  229.     ************************************************************************************/
  230.  
  231.     void
  232. RootMenu::MouseDown(
  233.     EventRecord    *event )
  234. {
  235.     AutoPort    autoPort( window() );
  236.     
  237.     short    itemHeight = kTopMargin + GetMaxFontHeight( "\pHelvetica", 12, bold ) + kBottomMargin;
  238.     Rect    curRect = { 0, 0, itemHeight, GetWindowWidth( &window_ ) };
  239.     Point    where = event->where;
  240.             GlobalToLocal( &where );
  241.     
  242.     //    Title
  243.     if( PtInRect( where, &curRect ) ) {
  244.         DragWindow( window(), event->where, &qd.screenBits.bounds );
  245.         gRootLoc = GetWindowLoc( &window_ );
  246.         return;
  247.     }
  248.     
  249.     //    Apple Menu
  250.     curRect.top += itemHeight;
  251.     curRect.bottom += itemHeight;
  252.     if( PtInRect( where, &curRect ) ) {
  253.         DrawWhiteBox( curRect );
  254.         short    diff = (itemHeight - 16) / 2;
  255.         Rect    iconRect = { curRect.top + diff, curRect.left + kLeftMargin,
  256.                             curRect.bottom - diff, curRect.left + kLeftMargin + 16 };
  257.         ThrowIfErr( PlotIconID( &iconRect, kAlignNone, kTransformNone, -16386 ), nil );
  258.         DrawSubMenu( curRect );
  259.         while( !LMGetMouseButtonState() ){}
  260.         DrawGrayBox( curRect );
  261.         DrawSubMenu( curRect );
  262.         ThrowIfErr( PlotIconID( &iconRect, kAlignNone, kTransformNone, -16386 ), nil );
  263.         GetMouse( &where );
  264.         if( PtInRect( where, &curRect ) ) {
  265.             new NormalMenu( (**GetMenuList()).menus[ 0 ].menu, true );
  266.         }
  267.     }
  268.     
  269.     //    Menus
  270.     Str255            s;
  271.     MenuListHandle    list = GetMenuList();
  272.                     RequireHandle( list );
  273.     UInt16            count = (**list).menuCount / 6;
  274.     
  275.     for( UInt16 index = 1; index < count; ++index ) {
  276.         MenuHandle    menu = (**list).menus[ index ].menu;
  277.                     RequireHandle( menu );
  278.         Handle        iconHandle = nil;
  279.         bool        hasIcon = ExtractMenuIcon( menu, iconHandle );
  280.                     RequireHandleIfNotNil( iconHandle );
  281.         curRect.top += itemHeight;
  282.         curRect.bottom += itemHeight;
  283.         if( PtInRect( where, &curRect ) ) {
  284.             DrawWhiteBox( curRect );
  285.             if( hasIcon ) {
  286.                 short    diff = (itemHeight - 16) / 2;
  287.                 Rect    iconRect = { curRect.top + diff, curRect.left + kLeftMargin,
  288.                                     curRect.bottom - diff, curRect.left + kLeftMargin + 16 };
  289.                 ThrowIfErr( PlotIconSuite( &iconRect, kAlignNone, kTransformNone, (IconSuiteRef) iconHandle ), nil );
  290.                 DrawSubMenu( curRect );
  291.             } else {
  292.                 MoveTo( curRect.left + kLeftMargin, curRect.bottom - kBottomMargin );
  293.                 RGBForeColor( &kRGBBlack );
  294.                 BlockMoveData( &menu[0]->menuData, s, menu[0]->menuData[ 0 ] + 1 );
  295.                 DrawString( s );
  296.                 DrawSubMenu( curRect );
  297.             }
  298.             while( !LMGetMouseButtonState() ){}
  299.             DrawGrayBox( curRect );
  300.             if( hasIcon ) {
  301.                 short    diff = (itemHeight - 16) / 2;
  302.                 Rect    iconRect = { curRect.top + diff, curRect.left + kLeftMargin,
  303.                                     curRect.bottom - diff, curRect.left + kLeftMargin + 16 };
  304.                 ThrowIfErr( PlotIconSuite( &iconRect, kAlignNone, kTransformNone, (IconSuiteRef) iconHandle ), nil );
  305.                 DrawSubMenu( curRect );
  306.             } else {
  307.                 MoveTo( curRect.left + kLeftMargin, curRect.bottom - kBottomMargin );
  308.                 RGBForeColor( &kRGBBlack );
  309.                 BlockMoveData( &menu[0]->menuData, s, menu[0]->menuData[ 0 ] + 1 );
  310.                 DrawString( s );
  311.                 DrawSubMenu( curRect );
  312.             }
  313.             GetMouse( &where );
  314.             if( PtInRect( where, &curRect ) ) {
  315.                 new NormalMenu( menu );
  316.             }
  317.             return;
  318.         }
  319.     }
  320. }
  321.  
  322. /****************************************************************************************
  323.     Commenter    Date                Comment
  324.     ---------    -----------------    -----------------------------------------------------
  325.     wolf        Fri, Jun 25, 1999    Created.
  326.     
  327.     ************************************************************************************/
  328.  
  329. CleanUp::~CleanUp()
  330. {
  331.     list< AbstractMenuWindow* >::iterator    menuB = gMenus.begin();
  332.     list< AbstractMenuWindow* >::iterator    menuE = gMenus.end();
  333.     while( menuB != menuE ) {
  334.         delete *menuB;
  335.         menuB = gMenus.begin();
  336.     }
  337. }
  338.  
  339. /****************************************************************************************
  340.     Commenter    Date                Comment
  341.     ---------    -----------------    -----------------------------------------------------
  342.     wolf        Fri, Jun 25, 1999    Created.
  343.     
  344.     ************************************************************************************/
  345.  
  346.     short
  347. GetWindowWidth(
  348.     WindowRecord    *w )
  349. {
  350.     RequirePtr( w );
  351.     RgnHandle    rgn = w->contRgn;
  352.     RequireHandle( rgn );
  353.     Rect        rect = (**rgn).rgnBBox;
  354.     return( rect.right - rect.left );
  355. }
  356.  
  357. /****************************************************************************************
  358.     Commenter    Date                Comment
  359.     ---------    -----------------    -----------------------------------------------------
  360.     wolf        Fri, Jun 25, 1999    Created.
  361.     
  362.     ************************************************************************************/
  363.  
  364.     Point
  365. GetWindowLoc(
  366.     WindowRecord    *w )
  367. {
  368.     RequirePtr( w );
  369.     RgnHandle    rgn = w->strucRgn;
  370.     RequireHandle( rgn );
  371.     Rect        rect = (**rgn).rgnBBox;
  372.     return( *(Point*) &rect );
  373. }
  374.  
  375. /****************************************************************************************
  376.     Commenter    Date                Comment
  377.     ---------    -----------------    -----------------------------------------------------
  378.     wolf        Fri, Jun 25, 1999    Created.
  379.     
  380.     ************************************************************************************/
  381.  
  382.     void
  383. DrawBlackBox(
  384.     const    Rect    &rect )
  385. {
  386.     RGBForeColor( &kBottomRightColor );
  387.     MoveTo( rect.right - 1, rect.top );
  388.     LineTo( rect.right - 1, rect.bottom - 1 );
  389.     LineTo( rect.left, rect.bottom - 1 );
  390.     RGBForeColor( &kTopLeftColor );
  391.     LineTo( rect.left, rect.top );
  392.     LineTo( rect.right, rect.top );
  393.     RGBForeColor( &kRGBBlack );
  394.     Rect    fillRect = { rect.top + 1, rect.left + 1, rect.bottom - 1, rect.right - 1 };
  395.     FillRect( &fillRect, &qd.black );
  396. }
  397.  
  398. /****************************************************************************************
  399.     Commenter    Date                Comment
  400.     ---------    -----------------    -----------------------------------------------------
  401.     wolf        Fri, Jun 25, 1999    Created.
  402.     
  403.     ************************************************************************************/
  404.  
  405.     void
  406. DrawGrayBox(
  407.     const    Rect    &rect )
  408. {
  409.     RGBForeColor( &kBottomRightColor );
  410.     MoveTo( rect.right - 1, rect.top );
  411.     LineTo( rect.right - 1, rect.bottom - 1 );
  412.     LineTo( rect.left, rect.bottom - 1 );
  413.     RGBForeColor( &kTopLeftColor );
  414.     LineTo( rect.left, rect.top );
  415.     LineTo( rect.right, rect.top );
  416.     RGBForeColor( &kBodyColor );
  417.     Rect    fillRect = { rect.top + 1, rect.left + 1, rect.bottom - 1, rect.right - 1 };
  418.     FillRect( &fillRect, &qd.black );
  419.     RGBForeColor( &kRGBBlack );
  420. }
  421.  
  422. /****************************************************************************************
  423.     Commenter    Date                Comment
  424.     ---------    -----------------    -----------------------------------------------------
  425.     wolf        Fri, Jun 25, 1999    Created.
  426.     
  427.     ************************************************************************************/
  428.  
  429.     void
  430. DrawWhiteBox(
  431.     const    Rect    &rect )
  432. {
  433.     RGBForeColor( &kBottomRightColor );
  434.     MoveTo( rect.right - 1, rect.top );
  435.     LineTo( rect.right - 1, rect.bottom - 1 );
  436.     LineTo( rect.left, rect.bottom - 1 );
  437.     RGBForeColor( &kTopLeftColor );
  438.     LineTo( rect.left, rect.top );
  439.     LineTo( rect.right, rect.top );
  440.     RGBForeColor( &kRGBWhite );
  441.     Rect    fillRect = { rect.top + 1, rect.left + 1, rect.bottom - 1, rect.right - 1 };
  442.     FillRect( &fillRect, &qd.black );
  443.     RGBForeColor( &kRGBBlack );
  444. }
  445.  
  446. /****************************************************************************************
  447.     Commenter    Date                Comment
  448.     ---------    -----------------    -----------------------------------------------------
  449.     wolf        Fri, Jun 25, 1999    Created.
  450.     
  451.     ************************************************************************************/
  452.  
  453.     void
  454. DrawSubMenu(
  455.     const    Rect    &rect )
  456. {
  457.     Point    right = { rect.top + ((rect.bottom - rect.top)/2), rect.right - kIconMargin };
  458.     Point    topLeft = { right.v - kIconHalfHieght, right.h - kIconWidth };
  459.     Point    bottomLeft = { right.v + kIconHalfHieght, right.h - kIconWidth };
  460.     
  461.     //Point    right = { rect.top + (rect.bottom - rect.top), rect.right - kIconMargin };
  462.     //Point    topLeft = { right.h + kIconHalfHieght, right.v - kIconWidth };
  463.     //Point    bottomLeft = { right.h - kIconHalfHieght, right.v - kIconWidth };
  464.     
  465.     RGBForeColor( &kBottomRightColor );
  466.     MoveTo( topLeft.h, topLeft.v );
  467.     LineTo( right.h, right.v );
  468.     RGBForeColor( &kTopLeftColor );
  469.     LineTo( bottomLeft.h, bottomLeft.v );
  470.     RGBForeColor( &kRGBBlack );
  471.     LineTo( topLeft.h, topLeft.v );
  472. }
  473.  
  474. /****************************************************************************************
  475.     Commenter    Date                Comment
  476.     ---------    -----------------    -----------------------------------------------------
  477.     wolf        Sat, Jun 26, 1999    Created.
  478.     
  479.     ************************************************************************************/
  480.  
  481. NormalMenu::NormalMenu(
  482.     MenuHandle    menu,
  483.     bool        apple )
  484. :    menu_( menu ), apple_( apple )
  485. {
  486.     MoveWindow( window(), 5 + gRootLoc.h + GetWindowWidth( (WindowRecord*) (*gMenus.begin())->window() ), 5, false );
  487.     short            minWidth = 0;// kLeftMargin + kCmdMargin + kRightMargin;
  488.     
  489.     //    Process Window Title
  490.     Handle    icon;
  491.     if( apple ) {
  492.         if( 16 > minWidth )
  493.             minWidth = 16;
  494.     } else {
  495.         if( ExtractMenuIcon( menu_, icon ) ) {
  496.             if( 16 > minWidth )
  497.                 minWidth = 16;
  498.         } else {
  499.             Str255            s;
  500.             BlockMoveData( &menu[0]->menuData, s, menu[0]->menuData[ 0 ] + 1 );
  501.             short            x = StringWidth( s );
  502.             if( x > minWidth )
  503.                 minWidth = x;
  504.         }
  505.     }
  506.     
  507.     //    "Normal" Menus
  508.     Str255    s;
  509.     short    itemCount = CountMenuItems( menu );
  510.     for( short itemIndex = 1; itemIndex < itemCount; ++itemIndex ) {
  511.         GetMenuItemText( menu, itemIndex, s );
  512.         short    x = StringWidth( s );
  513.         if( x > minWidth )
  514.             minWidth = x;
  515.     }
  516.     
  517.     minWidth += kLeftMargin + kCmdMargin + kSubMenuWidth + kRightMargin;
  518.     short    menuItemCount = 1 + itemCount;
  519.     short    minHeight = menuItemCount * (kTopMargin + GetMaxFontHeight( "\pHelvetica", 12, bold ) + kBottomMargin);
  520.     
  521.     SizeWindow( window(), minWidth, minHeight, false );
  522.     
  523.     Draw();
  524. }
  525.  
  526. /****************************************************************************************
  527.     Commenter    Date                Comment
  528.     ---------    -----------------    -----------------------------------------------------
  529.     wolf        Sat, Jun 26, 1999    Created.
  530.     
  531.     ************************************************************************************/
  532.  
  533.     void
  534. NormalMenu::Draw()
  535. {
  536.     AutoPort    autoPort( window() );
  537.     
  538.     short    itemHeight = kTopMargin + GetMaxFontHeight( "\pHelvetica", 12, bold ) + kBottomMargin;
  539.     Rect    curRect = { 0, 0, itemHeight, GetWindowWidth( &window_ ) };
  540.     
  541.     //    Title
  542.     Handle    icon;
  543.     Str255            s;
  544.     DrawBlackBox( curRect );
  545.     if( apple_ ) {
  546.         short    diff = (itemHeight - 16) / 2;
  547.         Rect    iconRect = { curRect.top + diff, curRect.left + kLeftMargin,
  548.                             curRect.bottom - diff, curRect.left + kLeftMargin + 16 };
  549.         ThrowIfErr( PlotIconID( &iconRect, kAlignNone, kTransformNone, -16386 ), nil );
  550.     } else {
  551.         if( ExtractMenuIcon( menu_, icon ) ) {
  552.             short    diff = (itemHeight - 16) / 2;
  553.             Rect    iconRect = { curRect.top + diff, curRect.left + kLeftMargin,
  554.                                     curRect.bottom - diff, curRect.left + kLeftMargin + 16 };
  555.             ThrowIfErr( PlotIconSuite( &iconRect, kAlignNone, kTransformNone, (IconSuiteRef) icon ), nil );
  556.         } else {
  557.             BlockMoveData( &menu_[0]->menuData, s, menu_[0]->menuData[ 0 ] + 1 );
  558.             MoveTo( curRect.left + kLeftMargin, curRect.bottom - kBottomMargin );
  559.             RGBForeColor( &kRGBWhite );
  560.             DrawString( s );
  561.         }
  562.     }
  563.     
  564.     /*(    Title
  565.     DrawBlackBox( curRect );
  566.     BlockMoveData( &menu_[0]->menuData, s, menu_[0]->menuData[ 0 ] + 1 );
  567.     MoveTo( curRect.left + kLeftMargin, curRect.bottom - kBottomMargin );
  568.     RGBForeColor( &kRGBWhite );
  569.     DrawString( s );*/
  570.     
  571.     //    "Normal" Menus
  572.     short    itemCount = CountMenuItems( menu_ );
  573.     for( short itemIndex = 1; itemIndex <= itemCount; ++itemIndex ) {
  574.         GetMenuItemText( menu_, itemIndex, s );
  575.         curRect.top += itemHeight;
  576.         curRect.bottom += itemHeight;
  577.         DrawGrayBox( curRect );
  578.         MoveTo( curRect.left + kLeftMargin, curRect.bottom - kBottomMargin );
  579.         RGBForeColor( &kRGBBlack );
  580.         DrawString( s );
  581.     }
  582. }
  583.  
  584. /****************************************************************************************
  585.     Commenter    Date                Comment
  586.     ---------    -----------------    -----------------------------------------------------
  587.     wolf        Sat, Jun 26, 1999    Created.
  588.     
  589.     ************************************************************************************/
  590.  
  591.     void
  592. NormalMenu::MouseDown(
  593.     EventRecord    *event )
  594. {
  595.     AutoPort    autoPort( window() );
  596.     
  597.     Str255    s;
  598.     short    itemHeight = kTopMargin + GetMaxFontHeight( "\pHelvetica", 12, bold ) + kBottomMargin;
  599.     Rect    curRect = { 0, 0, itemHeight, GetWindowWidth( &window_ ) };
  600.     Point    where = event->where;
  601.             GlobalToLocal( &where );
  602.     
  603.     //    Title
  604.     if( PtInRect( where, &curRect ) ) {
  605.         DragWindow( window(), event->where, &qd.screenBits.bounds );
  606.         return;
  607.     }
  608.     
  609.     //    "Normal" Menus
  610.     short    itemCount = CountMenuItems( menu_ );
  611.     for( short itemIndex = 1; itemIndex <= itemCount; ++itemIndex ) {
  612.         GetMenuItemText( menu_, itemIndex, s );
  613.         curRect.top += itemHeight;
  614.         curRect.bottom += itemHeight;
  615.         if( PtInRect( where, &curRect ) ) {
  616.             GetMenuItemText( menu_, itemIndex, s );
  617.             DrawWhiteBox( curRect );
  618.             MoveTo( curRect.left + kLeftMargin, curRect.bottom - kBottomMargin );
  619.             RGBForeColor( &kRGBBlack );
  620.             DrawString( s );
  621.             while( !LMGetMouseButtonState() ){}
  622.             DrawGrayBox( curRect );
  623.             MoveTo( curRect.left + kLeftMargin, curRect.bottom - kBottomMargin );
  624.             RGBForeColor( &kRGBBlack );
  625.             DrawString( s );
  626.             GetMouse( &where );
  627.             if( PtInRect( where, &curRect ) ) {
  628.                 SysBeep( 20 );
  629.             }
  630.         }
  631.     }
  632. }